// 滑动窗口+哈希表
// 此处可以用 hash[128] 数组来替代
class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] chars = s.toCharArray();

        int ret = 0, left = 0, right = 0;
        int[] hash = new int[128]; // 128 足够覆盖常见的字符
        int len = s.length();

        while(right < len) {
            hash[chars[right]]++; // 进窗口
            while(hash[chars[right]] > 1) { // 循环判断是否有重复字符
                hash[chars[left]]--; // 出窗口
                left++;
            }
            ret = Math.max(ret, right - left + 1); // 更新结果
            right++;
        }
        return ret;
    }
}